package com.cee.admin.common;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cee.common.core.domain.BaseEntity;
import com.cee.common.core.service.BasicService;
import com.cee.common.web.result.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;
import java.util.function.Function;

import static com.cee.common.web.result.ResultBuilder.success;


/**
 * 基本的删除接口 API
 *
 * @author rxliuli
 */
@SuppressWarnings("unused")
public interface BaseQueryApi<Service extends BasicService<Entity>, Entity extends BaseEntity> extends BaseDependencyInjectionApi<Service, Entity> {
    Logger log = LoggerFactory.getLogger(BaseQueryApi.class);

    /**
     * 通用的获取方法
     *
     * @param id 实体主键
     * @return 查询到的实体对象
     */
    @GetMapping("/get/{id}")
    default Result<Entity> get(@PathVariable("id") String id) {
        return using(service -> service.getById(id));
    }

    /**
     * 分页查询
     *
     * @param page 分页信息及实体参数
     * @return 查询到的一页数据
     */
    @GetMapping("/page")
    default Result<Page<Entity>> page(Page<Entity> page, Entity entity) {
        return using(service -> service.page(page, entity));
    }

    /**
     * 查询列表
     *
     * @param entity 实体参数
     * @return 查询到的数据列表
     */
    @GetMapping("/list")
    default Result<List<Entity>> list(Entity entity) {
        return using(service -> service.list(entity));
    }

    /**
     * 二次封装 using
     *
     * @param fn  方法
     * @param <T> 返回值类型，默认使用 Result 包装
     * @return 返回结果
     */
    default <T> Result<T> using(Function<Service, T> fn) {
        return using(BaseQueryApi.class, service -> success(fn.apply(service)));
    }

}
